package plgbase

import (
	"gitee.com/ymofen/gobase/evthub"
	"sync"
)

type EvtFuncs struct {
	lk     sync.RWMutex
	evtMap map[string]int32
}

func (this *EvtFuncs) closeEvtFuncs() {
	this.lk.Lock()
	defer this.lk.Unlock()
	for k, v := range this.evtMap {
		evthub.DefaultEvtHub.DelEvent(k, v)
		evthub.DefaultEvtHub.ReleasesEvtNode(k)
		delete(this.evtMap, k)
	}
}

func NewEvtFuncs() *EvtFuncs {
	rval := &EvtFuncs{evtMap: make(map[string]int32)}
	return rval
}

func (this *EvtFuncs) Close() error {
	this.closeEvtFuncs()
	return nil
}

// 如果evtid改变, 则会关闭之前的
// 可以重复调用, 插件关闭时需要调用Clsoe()
func (this *EvtFuncs) CheckAddEvent(evtid string, evtfn evthub.EvtFunc) error {
	if len(evtid) == 0 {
		return nil
	}

	this.lk.Lock()
	defer this.lk.Unlock()

	evthandle := this.evtMap[evtid]
	if evthandle == 0 {
		evthub.DefaultEvtHub.CheckGetEvtNode(evtid, true)
		evthandle = evthub.DefaultEvtHub.AddEvent(evtid, evtfn)
		this.evtMap[evtid] = evthandle
	}
	return nil
}
